package com.bwie.task;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bwie.domain.Type;
import com.bwie.es.EsTypeVo;
import com.bwie.mapper.TypeMapper;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.IndexOperations;
import org.springframework.data.elasticsearch.core.document.Document;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @BelongsProject: E-Commerce-Month-01
 * @BelongsPackage: com.bwie.task
 * @Author: asus
 * @CreateTime: 2025-10-31  18:35
 * @Description:
 * @Version: 1.0
 */
@Component
public class EsTypeTask {

    @Autowired private ElasticsearchRestTemplate elasticsearchRestTemplate; // Es 操作
    @Autowired private StringRedisTemplate redisTemplate; // redis 缓存
    @Autowired private TypeMapper typeMapper; // mapper

    /* Redis 首次同步缓存最近的时间 */
    public static final String ES_TYPE_KEY = "prod-type-to-es";

    /**
     * @description: 启动定时任务(corn = "0 * * * * ?")
     * @author: Zero
     * @date: 2025/10/31 18:39
     * @param: []
     * @return: void
     **/
    @Scheduled(cron = "0 * * * * ?")
    public void typeDataToEs(){
        System.out.println("[Es Type同步任务] 任务开始 ,时间：" + DateUtil.now());

        /* 1、判断 es_type 索引是否存在, true 存在 ,false 创建索引+映射 */
        IndexOperations indexOps = elasticsearchRestTemplate.indexOps(EsTypeVo.class);
        if (!indexOps.exists()){
            // 1.1 创建索引
            indexOps.create();
            // 1.2 创建映射
            Document mapping = indexOps.createMapping();
            indexOps.putMapping(mapping);
            System.out.println("[Es Type同步任务] es_type 索引创建");
        }
        /* 最大分页 */
        Page<Type> typePage = new Page<>(1, 99999);
        /* 时间 */
        String now = DateUtil.now();

        /* 2、判断 redis 中是否存在 key 首次同步：全量 | 后续同步：增量 */
        if(!redisTemplate.hasKey(ES_TYPE_KEY)){
            // 全量同步
           Page<Type> page = typeMapper.selectTypeListByPage(typePage,null,null);
            System.out.println("[Es Type同步任务]  全量同步，查询出"+page.getRecords().size()+"条数据");
            this.syncTypeDataToEs(page.getRecords());
        }else {
            // 增量同步数据
            String redisTypeTime = redisTemplate.opsForValue().get(ES_TYPE_KEY);
            Page<Type> page = typeMapper.selectTypeListByPage(typePage, null, redisTypeTime);
            System.out.println("[Es Type同步任务] 增量同步，更新"+page.getRecords().size()+"条数据");
            this.syncTypeDataToEs(page.getRecords());
        }
        /* Redis 返回时间 定时 30分钟 防止数据勾留 */
        redisTemplate.opsForValue().set(ES_TYPE_KEY,now,30, TimeUnit.MINUTES);
    }
    /**
     * @description: syncTypeDataToEs
     * @author: Zero
     * @date: 2025/10/31 19:09
     * @param: void
     * @return:
     **/
    private void syncTypeDataToEs(List<Type> typeList){
        // 空保护
        if (typeList == null || typeList.isEmpty()){
             System.out.println("[Es Type同步任务] 参数列表为空，跳过");
            return ;
        }
        /* 参数传递到Es 中 */
        for (Type type : typeList) {
            EsTypeVo esTypeVo = new EsTypeVo();
            BeanUtil.copyProperties(type,esTypeVo);
            elasticsearchRestTemplate.save(esTypeVo);
        }
        System.out.println("[Es Type同步任务] 同步完成，同步"+typeList.size()+"条数据");

    }
}
